// v2_jwt/handlers/user_handlers.go
package handlers

import (
	// "errors"
	"database/sql"
	"grpc-jwt-yonghurenzheng/jwt_grpc_gin/config"
	"grpc-jwt-yonghurenzheng/jwt_grpc_gin/models"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
)

// getProfileHandler 从数据库获取用户信息
func GetProfileHandler(c *gin.Context) {
	// ① 从JWT中取出当前登录用户
	claimsAny, exists := c.Get("userClaims")
    if !exists {
        c.JSON(http.StatusUnauthorized, gin.H{"error": "未登录"})
        return
    }
    claims := claimsAny.(*models.Claims)

	// 从URL路径参数中获取用户ID
	// 在RESTful设计中，通常通过 /users/:id 来指定资源
	userIDStr := c.Param("id")
	userID, err := strconv.ParseInt(userIDStr, 10, 64)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	// ③ 检查Token中用户ID是否匹配路径ID
    if claims.UserID != userID {
        c.JSON(http.StatusForbidden, gin.H{"error": "禁止访问他人信息"})
        return
    }

	// --- 关键安全点 ---
	// 在真实项目中，这里应校验网关传递过来的用户ID是否和路径中的ID匹配
	// 本示例中简化，直接使用路径ID查询
	var user models.User
	dbErr := config.DB.QueryRow("SELECT id, username, email FROM users WHERE id = ?", userID).
		Scan(&user.ID, &user.Username, &user.Email)
	
	if dbErr != nil {
		if dbErr == sql.ErrNoRows {
			c.JSON(http.StatusNotFound, gin.H{"error": "用户不存在"})
			return
		}
		c.JSON(http.StatusInternalServerError, gin.H{"error": "查询数据库失败"})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"id":       user.ID,
		"username": user.Username,
		"email":    user.Email,
	})
}

func DeleteUser(c *gin.Context){
	// ① 从JWT中取出当前登录用户
	claimsAny, exists := c.Get("userClaims")
    if !exists {
        c.JSON(http.StatusUnauthorized, gin.H{"error": "未登录"})
        return
    }
    claims := claimsAny.(*models.Claims)

	// 从URL路径参数中获取用户ID
	// 在RESTful设计中，通常通过 /users/:id 来指定资源
	userIDStr := c.Param("id")
	userID, err := strconv.ParseInt(userIDStr, 10, 64)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	// ③ 检查Token中用户ID是否匹配路径ID
    if claims.UserID != userID {
        c.JSON(http.StatusForbidden, gin.H{"error": "禁止访问他人信息"})
        return
    }

	_,err1 := config.DB.Exec("Delete FROM users WHERE id = ?", userID)
	if err1 != nil {
		c.JSON(http.StatusInternalServerError,gin.H{"error":"删除用户失败"+err1.Error()})
		return
	}
}

